#ifndef LISTA_H_INCLUDED
#define LISTA_H_INCLUDED

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef void* tipo_lista;

typedef struct StructNo {
	tipo_lista valor;
	struct StructNo *prox, *anterior;
} No;

typedef struct {
	No *inicio, *fim;
	int size;
} Lista;

No*  criarNo();

void liberarNo(No* N);

Lista* criarLista();

void liberarLista(Lista *L);

int  taVazia(const Lista *L);
void inserirInicio(Lista *L, tipo_lista dado);
void inserirFim(Lista *L, tipo_lista dado);
void inserirOrdenado(Lista *L, tipo_lista dado, int(*compara)(const void* a, const void* b) );


tipo_lista buscar(const Lista* L, const tipo_lista elem, int(*compara)(const void* a, const void* b));

No* removerNo(No* no);
No* proximoNo(No* no);
int ultimoNo(const Lista* L, No* no);
No* primeiroNo(const Lista* L);

int removerInicio(Lista* L);
tipo_lista primeiro(Lista* L);
int removerFim(Lista* L);

#endif

